//package titt.service.content.listener;
//
//import java.util.ArrayList;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//
//import titt.TITTValues;
//
//public class IOGarbageCollector {
//	
//	private static IOGarbageCollector instance = new IOGarbageCollector();
//	private ArrayList<IOTimeoutListener> os = new ArrayList<IOTimeoutListener>();
//	private ExecutorService e;
//	
//	public static IOGarbageCollector get() {
//		return instance;
//	}
//	
//	protected IOGarbageCollector() {}
//	
//	private void start() {
//		if(e != null)
//			e.shutdownNow();
//		e = Executors.newSingleThreadExecutor();
//		e.execute(new Runnable() {
//			public void run() {
//				try {
//					while(true) {
//						Thread.sleep(1000 * TITTValues.NUDER_IO_TIMEOUT);
//						perform();
//					}
//				}
//				catch(Exception e) {
//					
//				}
//			}
//		});
//	}
//	
//	private synchronized void perform() {
//		long limit = System.currentTimeMillis() - (1000 * TITTValues.NUDER_IO_TIMEOUT);
//		int i = 0;
//
//		while(i < os.size()) {
//			IOTimeoutListener o = os.get(i++);
//			if(o.getLastSuccess() < limit) {
//				o.kill();
//				i--;
//			}
//		}
//	}
//	
//	public synchronized void add(IOTimeoutListener o) {
//		os.add(o);
//		if(os.size() == 1)
//			start();
//	}
//	
//	public synchronized void remove(IOTimeoutListener o) {
//		os.remove(o);
//		System.out.println("removed");
//		if(os.size() == 0) {
//			e.shutdownNow();
//			e = null;
//		}
//	}
//	
//	public static void main(String[] args) throws Exception {
//		IOTimeoutListener io = new IOTimeoutListener(null, null, null);
//		IOGarbageCollector2.get().add(io);
//		System.out.println(TITTValues.NUDER_IO_TIMEOUT);
//		io.onInitiate(0);
//	}
//
//	
//}

package titt.service.content.listener;

import java.util.ArrayList;

import titt.TITTValues;
import titt.service.threading.SingleTITTThreader;
import titt.service.threading.TITTThreader;

public class IOGarbageCollector implements Runnable {
	
	private final static IOGarbageCollector instance = new IOGarbageCollector();
	private final ArrayList<IOTimeoutListener> os = new ArrayList<IOTimeoutListener>();
	private final TITTThreader threader = new SingleTITTThreader();
	
	public static IOGarbageCollector get() {
		return instance;
	}
	
	protected IOGarbageCollector() {}
	
	@Override
	public void run() {
		try {
			while(true) {
				Thread.sleep(1000 * TITTValues.NUDER_IO_TIMEOUT);
				perform();				
			}
		}
		catch(Exception e) {}
	}
		
	private synchronized void perform() {
		//System.out.println("gc");
		long limit = System.currentTimeMillis() - (1000 * TITTValues.NUDER_IO_TIMEOUT);

		int i = 0;
		while(i < os.size()) {
	//		System.out.println("foo " + i);
			IOTimeoutListener o = os.get(i++);
			if(o.getLastSuccess() < limit) {
				o.kill();
				i--;
			}
		}
		
	//	System.out.println("done gc");
	}
	
	public synchronized void add(IOTimeoutListener o) {
		if(os.isEmpty())
			threader.execute(this);
		
		os.add(o);
	}
	
	public synchronized void remove(IOTimeoutListener o) {
		os.remove(o);

		if(os.isEmpty())
			threader.clear();
	}	
	
}
